#include <stdio.h>
#include "led_color.h"
#include <math.h>

// 定义HSV颜色结构体，包含色相、饱和度和亮度
typedef struct {
    float h; // 色相
    float s; // 饱和度
    float v; // 亮度
} hsv_color_t;


// 将RGB颜色转换为HSV颜色
hsv_color_t rgbToHsv(led_color_t rgbColor) {
    float r = rgbColor.r / 255.0;
    float g = rgbColor.g / 255.0;
    float b = rgbColor.b / 255.0;

    float cmax = fmaxf(fmaxf(r, g), b);
    float cmin = fminf(fminf(r, g), b);
    float delta = cmax - cmin;

    hsv_color_t hsvColor;

    // 计算色相 h
    if (delta == 0) {
        hsvColor.h = 0;
    } else if (cmax == r) {
        hsvColor.h = 60 * fmodf((g - b) / delta, 6);
    } else if (cmax == g) {
        hsvColor.h = 60 * ((b - r) / delta + 2);
    } else {
        hsvColor.h = 60 * ((r - g) / delta + 4);
    }

    if (hsvColor.h < 0) {
        hsvColor.h += 360;
    }

    // 计算饱和度 s
    if (cmax == 0) {
        hsvColor.s = 0;
    } else {
        hsvColor.s = delta / cmax;
    }

    // 计算亮度 v
    hsvColor.v = cmax;

    return hsvColor;
}

// 将HSV颜色转换为RGB颜色
led_color_t hsvToRgb(hsv_color_t hsvColor) {
    float c = hsvColor.v * hsvColor.s;
    float x = c * (1 - fabsf(fmodf(hsvColor.h / 60, 2) - 1));
    float m = hsvColor.v - c;

    float r, g, b;

    if (hsvColor.h >= 0 && hsvColor.h < 60) {
        r = c;
        g = x;
        b = 0;
    } else if (hsvColor.h >= 60 && hsvColor.h < 120) {
        r = x;
        g = c;
        b = 0;
    } else if (hsvColor.h >= 120 && hsvColor.h < 180) {
        r = 0;
        g = c;
        b = x;
    } else if (hsvColor.h >= 180 && hsvColor.h < 240) {
        r = 0;
        g = x;
        b = c;
    } else if (hsvColor.h >= 240 && hsvColor.h < 300) {
        r = x;
        g = 0;
        b = c;
    } else {
        r = c;
        g = 0;
        b = x;
    }

    led_color_t rgbColor;
    rgbColor.r = (r + m) * 255;
    rgbColor.g = (g + m) * 255;
    rgbColor.b = (b + m) * 255;

    return rgbColor;
}

// 调整颜色的饱和度
led_color_t adjustSaturation(led_color_t color, float saturationDelta) {
    // 将RGB颜色转换为HSV颜色
    hsv_color_t hsvColor = rgbToHsv(color);

    // 调整饱和度
    hsvColor.s += saturationDelta;
    if (hsvColor.s < 0) {
        hsvColor.s = 0;
    } else if (hsvColor.s > 1) {
        hsvColor.s = 1;
    }

    // 将调整后的HSV颜色转换回RGB颜色
    return hsvToRgb(hsvColor);
}

// 增加或减少颜色的亮度
led_color_t adjustBrightness(led_color_t color, int amount) {
    // 对RGB分量进行增加或减少
    if(color.r > amount){
        color.r -= amount;
    }
    if(color.g > amount){
        color.g -= amount;
    }
    if(color.b > amount){
        color.b -= amount;
    }    
    return color;
}


#if 0
int main() {
    // 示例颜色的RGB分量值
    led_color_t color = {100, 150, 200};

    // 枚举变量，控制增加或减少饱和度
    enum SaturationOperation operation = DECREASE;

    // 增加或减少饱和度的量，范围在0.0到1.0之间
    float saturationAmount = 0.2;

    // 增加或减少亮度的量
    int brightnessAmount = -30;

    // 调整颜色的饱和度
    led_color_t newColor = adjustSaturation(color, operation, saturationAmount);

    // 调整颜色的亮度
    newColor = adjustBrightness(newColor, brightnessAmount);

    // 输出结果
    printf("调整后的RGB颜色: (%d, %d, %d)\n", newColor.r, newColor.g, newColor.b);

    return 0;
}
#endif